package main

import (
	"flag"
	"fmt"
	"github.com/vladimirvivien/gowfs"
	"log"
	"os"
	"strconv"
	"time"
)

//操作hdfs
func main() {
	//指定namenode
	var namenode = flag.String("namenode", "t1.utan.com:50070", "namenode address")
	//指定操纵目录
	//var hdfsPath = flag.String("path", "/data/", "HDFS file path")
	//指定用户名
	var username = flag.String("user", "root", "HDFS user")

	flag.Parse()

	//创建配置文件
	conf := *gowfs.NewConfiguration()

	//配置NameNode和用户
	conf.Addr = *namenode
	conf.User = *username

	//得到FileSystem
	fileSystem, err := gowfs.NewFileSystem(conf)
	if err != nil {
		log.Fatal(err)
	}

	//test connection
	testConn(fileSystem)

	//创建目录
	createDir(fileSystem, "/data/")

	//查看目录
	listDir(fileSystem,"/")
}
func listDir(fs *gowfs.FileSystem, hdfs string) {
	//检查状态
	statuses, err := fs.ListStatus(gowfs.Path{Name: hdfs})
	if err != nil {
		log.Fatal("无法获得地址", err)
	}

	for _,stat:= range statuses  {
		fmt.Printf("%s  %s  %s %s %d %s %s\n",
			//获取文件权限
			FileMode(stat.Permission,stat.Type),
			//获取文件类型
			formatReplication(stat.Replication, stat.Type),
			//获取文件创建的用户
			stat.Owner,
			//获取组
			stat.Group,
			//获取大小
			stat.Length,
			//获取创建的时间
			formatTime(stat.ModificationTime),
			//获取目录
			stat.PathSuffix,
			)
	}
}

//格式化时间
func formatTime(modTime int64) string{
	unix := time.Unix((modTime / 1000), 0)

	return unix.Format("2006-01-02 15:04:05")
}

//
func formatReplication(rep int64, fileType string) string {

	repStr := strconv.FormatInt(rep, 8)
	if fileType == "DIRECTORY"{
		repStr = "-"
	}
	return repStr
}

func FileMode(fsPerm string, fileType string) string{
	//权限编码 例如744 进行转换
	perm, _ := strconv.ParseInt(fsPerm, 8, 16)
	//
	fm := os.FileMode(perm)

	//如果是目录
	if fileType == "DIRECTORY"{
		fm = fm | os.ModeDir
	}

	return fm.String()

}

//创建目录
func createDir(fs *gowfs.FileSystem, hdfsPath string) {
	path := gowfs.Path{Name: hdfsPath}
	//创建目录
	ok, err := fs.MkDirs(path, 0744)
	if err != nil || !ok{
		log.Fatal(err)
	}

	log.Println("HDFS PATH ",path.Name,"created")


}

//测试连接
func testConn(fs *gowfs.FileSystem) {
	//根目录状态
	_, err := fs.ListStatus(gowfs.Path{Name: "/"})
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("连接成功 %s \n", fs.Config.Addr)
}
